package com.xzzz.irda.guardcat.core.pojo;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import com.xzzz.common.base.util.SystemUtil;
import com.xzzz.common.base.util.spring.SpringUtil;
import com.xzzz.irda.guardcat.core.constants.GuardcatConstant;
import com.xzzz.irda.tracker.core.Tracker;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * 警告对象
 *
 * @author xzzz
 */
@Data
@Accessors(chain = true)
public class Alert {
    /**
     * 警告ID
     */
    private String id;
    /**
     * 机器ID
     *
     * @see GuardcatConstant#MACHINE_ID
     */
    private String machineId;
    /**
     * 应用名称 spring.application.name
     */
    private String appName;
    /**
     * 机器名称
     */
    private String hostName;
    /**
     * 环境
     */
    private String profilesActive;
    /**
     * 警告标题
     */
    private String title;
    /**
     * 警告内容
     */
    private String content;
    /**
     * 警告级别，预留
     */
    private Level level = Level.ERROR;
    /**
     * 警告时间
     */
    private Date creTime;
    /**
     * 警告已读
     */
    private Boolean read = false;
    /**
     * 链路追踪ID
     */
    private String traceId;
    /**
     * 是否发送通知, 为 true 则发送各类通知, 否则不发送,只会添加到记录中
     */
    private Boolean notification = false;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 企业微信机器人
     */
    private String wechatRobot;

    /**
     * 警告的级别, 不同的级别发送的内容不相同
     */
    public enum Level {
        /**
         * 通知级别, 发送的是通知,而不是警告
         */
        INFO,
        /**
         * 警告级别, 发送的是警告
         */
        WARN,
        /**
         * 错误级别, 发送的是警告
         */
        ERROR;

        public static Level getByName(String name) {
            for (Level value : Level.values()) {
                if (value.name().equals(name)) {
                    return value;
                }
            }
            return INFO;
        }
    }

    public static Alert build(String title, String content, boolean notification) {
        Alert alert = new Alert();

        alert.setId(UUID.fastUUID().toString(true).toUpperCase());
        alert.setAppName(SpringUtil.getAppName());
        alert.setMachineId(GuardcatConstant.MACHINE_ID);

        alert.setTitle(StrUtil.isBlank(title) ? "无标题" : title);
        alert.setContent(StrUtil.isBlank(content) ? "无内容" : content);
        alert.setLevel(Level.ERROR);

        alert.setCreTime(DateUtil.date());
        alert.setNotification(notification);
        alert.setTraceId(Tracker.getTraceId());

        alert.setHostName(SystemUtil.getHostName());
        alert.setProfilesActive(SpringUtil.getProfileAction());
        return alert;
    }

    public Alert notificationChannel(String phones, String emails, String wechatRobots) {
        if (phones != null) {
            this.phone = phones;
        }
        if (emails != null) {
            this.email = emails;
        }
        if (wechatRobots != null) {
            this.wechatRobot = wechatRobots;
        }
        return this;
    }
}
